package net.sh.dpinfrastructure.search;

import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sh.dpinfrastructure.db.DPPageAndSort;
import net.sh.dpinfrastructure.db.DPSearchStatement;


/**
 * 
 * 搜索<br>
 * 一般来说，遵从如下原则：
 * <ol>
 *  <li>搜索里的数据都是从其他数据源（mongodb，mysql）里同步而来，作用是方便索引及全文检索</li>
 * </ol>
 * 
 * @version 1.0
 * @since JDK1.7
 * @author shaohui
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2016 SunTime Co'Ltd Inc. All rights reserved.
 * @date 2016年4月15日 下午2:00:07
 */
public interface DPSearch {
    
    /**
     * 
     * 查询总数
     *
     * @param database
     * @param table
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:08:40
     *
     */
    long count(String table);
    
    /**
     * 
     * 查询总数
     *
     * @param database
     * @param table
     * @param criteria
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:08:10
     *
     */
    long count(String table, DPSearchStatement criteria);
    
    /**
     * 
     * 删除记录，逻辑或者物理方式
     *
     * @param database
     * @param table
     * @param criteria
     * @param logically
     * @return
     * 
     * @author shaohui
     * @date 2016年8月17日 下午1:06:21
     */
    int delete(String table, DPSearchStatement criteria, boolean logically);
    
    /**
     * 
     * 删除记录
     *
     * @param database
     * @param table
     * @param criteria
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:07:13
     *
     */
    int delete(String table, DPSearchStatement criteria);
    
    /**
     * 
     * 删除记录
     *
     * @param database
     * @param table
     * @param id
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:07:24
     *
     */
    int delete(String table, long id);
    
    /**
     * 
     * 删除记录
     *
     * @param database
     * @param table
     * @param id
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:07:47
     *
     */
    int delete(String table, String id);
    
    /**
     * 
     * 批量插入数据
     *
     * @param database
     * @param table
     * @param sources
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:34:14
     */
    int insert(String table, List<Map<String, Object>> sources);
    
    /**
     * 插入数据
     * Lancer
     * 2016年4月24日上午9:35:47
     * @param datasource
     * @param table
     * @param source
     *
     */
    int insert(String table, Map<String, Object> source);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @return
     * 
     * @author shaohui
     * @date 2016年8月16日 下午7:25:06
     */
    List<Map<String, Object>> query(String table);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:31:57
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:31:43
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:33:10
     */
    <T> List<T> query(String table, DPSearchStatement criteria, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param mapper
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:59
     */
    <T> List<T> query(String table, DPSearchStatement criteria, DPDocumentMapper<T> mapper, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:36
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fieldsMap
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:22
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Map<String, String> fieldsMap, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:31:51
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Set<String> fields);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:31:24
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Set<String> fields, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:33:04
     */
    <T> List<T> query(String table, DPSearchStatement criteria, Set<String> fields, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param mapper
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:48
     */
    <T> List<T> query(String table, DPSearchStatement criteria, Set<String> fields, DPDocumentMapper<T> mapper, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:30
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Set<String> fields, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param fieldsMap
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:10
     */
    List<Map<String, Object>> query(String table, DPSearchStatement criteria, Set<String> fields, Map<String, String> fieldsMap, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:04
     */
    List<Map<String, Object>> query(String table, Set<String> fields);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:31:31
     */
    List<Map<String, Object>> query(String table, Set<String> fields, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:33:16
     */
    <T> List<T> query(String table, Set<String> fields, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @param mapper
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:53
     */
    <T> List<T> query(String table, Set<String> fields, DPDocumentMapper<T> mapper, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:42
     */
    List<Map<String, Object>> query(String table, Set<String> fields, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询
     *
     * @param database
     * @param table
     * @param fields
     * @param fieldsMap
     * @param extendCondition
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:32:16
     */
    List<Map<String, Object>> query(String table, Set<String> fields, Map<String, String> fieldsMap, DPPageAndSort extendCondition);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param criteria
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:12:04
     */
    Map<String, Object> queryForMap(String table, DPSearchStatement criteria);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param criteria
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午2:31:34
     */
    Map<String, Object> queryForMap(String table, DPSearchStatement criteria, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:11:53
     */
    Map<String, Object> queryForMap(String table, DPSearchStatement criteria, Set<String> fields);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:11:53
     */
    Map<String, Object> queryForMap(String table, DPSearchStatement criteria, Set<String> fields, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:07
     */
    Map<String, Object> queryForMap(String table, long id);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:30
     */
    Map<String, Object> queryForMap(String table, long id, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:22
     */
    Map<String, Object> queryForMap(String table, long id, Set<String> fields);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @param fieldsMap
     * @return
     *
     * @author Lancer
     * @date 2016年5月8日下午5:35:01
     *
     */
    Map<String, Object> queryForMap(String table, long id, Set<String> fields, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:12:37
     */
    Map<String, Object> queryForMap(String table, String id);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fieldsMap
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:02
     */
    Map<String, Object> queryForMap(String table, String id, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:12:43
     */
    Map<String, Object> queryForMap(String table, String id, Set<String> fields);
    
    /**
     * 
     * 查询单条记录
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @param fieldsMap
     * @return
     *
     * @author Lancer
     * @date 2016年5月8日下午5:34:19
     *
     */
    Map<String, Object> queryForMap(String table, String id, Set<String> fields, Map<String, String> fieldsMap);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param criteria
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:44
     */
    <T> T queryForObject(String table, DPSearchStatement criteria, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param criteria
     * @param fields
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午2:46:45
     */
    <T> T queryForObject(String table, DPSearchStatement criteria, Set<String> fields, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param id
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:14:32
     */
    <T> T queryForObject(String table, long id, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:13:50
     */
    <T> T queryForObject(String table, long id, Set<String> fields, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param id
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:14:44
     */
    <T> T queryForObject(String table, String id, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 查询单条记录，指定返回类型
     *
     * @param database
     * @param table
     * @param id
     * @param fields
     * @param mapper
     * @return
     * 
     * @author shaohui
     * @date 2016年4月29日 下午5:14:38
     */
    <T> T queryForObject(String table, String id, Set<String> fields, DPDocumentMapper<T> mapper);
    
    /**
     * 
     * 更新记录
     * 
     * @param database
     * @param table
     * @param criteria
     * @param newSources
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:05:19
     *
     */
    int update(String table, DPSearchStatement criteria, Map<String, Object> newSources);
    
    /**
     * 
     * 更新记录
     *
     * @param database
     * @param table
     * @param criteria
     * @param newSources
     * @param upsert
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:06:49
     *
     */
    int update(String table, DPSearchStatement criteria, Map<String, Object> newSources, boolean upsert);
    
    /**
     * 
     * 更新记录
     *
     * @param database
     * @param table
     * @param id
     * @param newSources
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:06:12
     *
     */
    int update(String table, long id, Map<String, Object> newSources);
    
    /**
     * 
     * 更新记录
     *
     * @param database
     * @param table
     * @param id
     * @param newSources
     * @param upsert
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:07:01
     *
     */
    int update(String table, long id, Map<String, Object> newSources, boolean upsert);
    
    /**
     * 
     * 更新记录
     *
     * @param database
     * @param table
     * @param id
     * @param newSources
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:06:24
     *
     */
    int update(String table, String id, Map<String, Object> newSources);
    
    /**
     * 
     * 更新记录
     *
     * @param database
     * @param table
     * @param id
     * @param newSources
     * @param upsert
     * @return
     *
     * @author Lancer
     * @date 2016年5月1日下午2:07:06
     *
     */
    int update(String table, String id, Map<String, Object> newSources, boolean upsert);
}
